<?php
/*
	Aurus CMS - free OOP CMS
	Copyright (C) 2010  Nestor Yanchuk

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 2 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('ROOT')) die();

/**
 * Клас для роботи з файлами конфігурацій в адміністративній частині, а точніше для легкого створення сторінок настройок
 * 
 * @package Aurus
 * @author Kvis
 * @copyright 2010
 * @version 1.0
 * @access public
 */

class makeConfig {
	/**
	 * Приватний масив конфігурацій
	 *
	 * @var array
	 */
	private $configs = array();

	private $helpImage = '';

	/**
	 * Згенерований HTML код сторінки настройок
	 *
	 * @var string
	 */
	private $configPage = '';

	/**
	 * Назва поточного файлу конфігурацій
	 *
	 * @var string
	 * @see makeConfig->__construct()
	 */
	private $cc = '';

	/**
	 * Функція ініціації класу
	 *
	 * @param string $currentConfig - назва файлу конфігурації
	 */
	public function __construct($currentConfig) {
		$this->helpImage = LINK_ROOT . 'adminarea/template/images/help.gif';
		$this->cc = $currentConfig;
		if (isset($_POST['data'])) {
			$this->saveConfig($_POST['data']);
			Aurus::getInstance()->addContent(Adminarea::getInstance()->adminInfo(__('Зміни збережено')));
		}
		return $this;
	}

	/**
	 * @ignore 
	 */
	private function readConfig($module) {
		if (file_exists(MAINDIR . '/configs/config.' . $module . '.php')) {
			include (MAINDIR . '/configs/config.' . $module . '.php');
		} else {
			$config = array();
		}
		$this->configs[$module] = $config;
	}
	/**
	 * @ignore 
	 */
	private function getConfigVar($var) {
		if (!isset($this->configs[$this->cc]) or !is_array($this->configs[$this->cc])) {
			$this->readConfig($this->cc);
		}
		return isset($this->configs[$this->cc][$var]) ? $this->configs[$this->cc][$var] : '';
	}
	/**
	 * Додавання лінійного текстового поля до сторінки настройок
	 *
	 * @param string $name - назва поля, а також і ключа в настройках після збереження(лятиницею), наприклад: site_name
	 * @param string $desc - опис поля, нормальною мовою для сприйняття користувачем, наприклад: назва сайту
	 * @param string $help - спливаюча підказка до поля, наприклад: назва сайту, яка буде відображена на кожній його сторінці
	 */
	public function input($name, $desc, $help = '') {
		if ($help) {
			$help = '<div class="help"><img alt="?" class="helpimg" src="'.$this->helpImage.'"><div class="helptext">' . $help . '</div></div>';
		}
		$this->configPage[$help . $desc] = '<input name="data[' . $name . ']" type="text" value="' . $this->getConfigVar($name) . '" />';
	return $this;
	}
	/**
	 * Додавання багаторядкового текстового поля до сторінки настройок
	 *
	 * @param string $name - назва поля, а також і ключа в настройках після збереження(лятиницею), наприклад: meta
	 * @param string $desc - опис поля, нормальною мовою для сприйняття користувачем, наприклад: META-теги сайту
	 * @param string $help - спливаюча підказка до поля, наприклад: META-теги сайту, які будуть додані в початковий код сторінки, корисно для СЕО
	 */
	public function textarea($name, $desc, $help = '') {
		if ($help) {
			$help = '<div class="help"><img alt="?" class="helpimg" src="'.$this->helpImage.'"><div class="helptext">' . $help . '</div></div>';
		}
		$this->configPage[$help . $desc] = '<textarea rows="15" cols="50" name="data[' . $name . ']" style="width:300px;height:150px;">' . $this->getConfigVar($name) . '</textarea>';
	return $this;
	}

	/**
	 * Додавання випадаючого списку поля до сторінки настройок
	 *
	 * @param string $name - назва поля, а також і ключа в настройках після збереження(лятиницею), наприклад: site_name
	 * @param string $desc - опис поля, нормальною мовою для сприйняття користувачем, наприклад: порядок сортування коментарів
	 * @param string $vars - асоціативний масив з варіантами вибору та їх описом, наприклад:
	 * 							array(
	 * 								'DESC'	=>	'Нові спочатку',
	 * 								'ASC'	=>	'Нові в кінці'
	 * 							)
	 * @param string $help - спливаюча підказка до поля
	 */
	public function select($name, $desc, $vars, $help = '') {
		if ($help) {
			$help = '<div class="help"><img alt="?" class="helpimg" src="'.$this->helpImage.'"><div class="helptext">' . $help . '</div></div>';
		}
		$def = $this->getConfigVar($name);
		$ret = '<select name="data[' . $name . ']">';
		if ((gettype($vars) !== gettype(array())) or !count($vars)) {
			$ret .= '<option value=""></option></select>';
			$this->configPage[$help . $desc] = $ret;
			return $this;
		}
		foreach ($vars as $key => $value) {
			$p = ($def == $key) ? ' selected="selected" ' : '';
			$ret .= '<option value="' . $key . '"' . $p . '>' . $value . '</option>' . RN;
		}
		$ret .= '</select>';
		$this->configPage[$help . $desc] = $ret;
		return $this;
	}

	/**
	 * Часто буває що певну функцію можнавключити або відключити.
	 * Додавання до сторінки настройок вибору "так" або "ні"
	 *
	 * @param string $name - назва поля, а також і ключа в настройках після збереження(лятиницею), наприклад: close_site
	 * @param string $desc - опис поля, нормальною мовою для сприйняття користувачем, наприклад: вимкнути сайт?
	 * @param string $help - спливаюча підказка до поля
	 */
	public function yesNo($name, $desc, $help = '') {
		if ($help) {
			$help = '<div class="help"><img alt="?" class="helpimg" src="'.$this->helpImage.'"><div class="helptext">' . $help . '</div></div>';
		}
		if ($this->getConfigVar($name)) {
			$yes = ' checked="checked"';
			$no = '';
		} else {
			$no = ' checked="checked"';
			$yes = '';
		}
		$this->configPage[$help . $desc] = '<input type="radio" name="data[' . $name . ']" value="1"' . $yes . '>' . __('Так') . ' <input type="radio" name="data[' . $name . ']" value="0"' . $no . '>' . __('Ні') . '';
	return $this;
	}
	/**
	 * Функція встановлює згенерований код як контент сторінки
	 *
	 */
	public function get() {
		$start = Aurus::getInstance()->form_start();

		$middle = Html::table(Html::td($this->configPage, 'confclass'));

		$end = '<div align="center"><input class="input" type="submit" value="' . __('Зберегти') . '"> |
		<input class="input" type="reset" value="' . __('Збити') . '"></div></form>';
		Aurus::getInstance()->addContent($start . $middle . $end);
	}
	/**
	 * @ignore 
	 */
	private function saveConfig($data) {
		if (!is_array($data)) {
			return;
		}
		
		$cft = '<?php'.RN;
		$cft .= '$config = ';
		$cft .= var_export($data,true).';'.RN;
		$cft .= '?>';

		file_put_contents(MAINDIR . '/configs/config.' . $this->cc . '.php',$cft);
	}

	/**
	 * Встановлення пустого рядка для зручності читання
	 *
	 */
	public function br() {
		$this->configPage['<div style="display:none;visibility:hidden">' . uniqid() . '</div>'] = '<br />';
		return $this;
	}
}